package cn.catsdad.base.repository;

import cn.catsdad.base.entity.BaseEntity;
import cn.catsdad.constant.constant.ICommonWarningType;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.repository.NoRepositoryBean;

import java.util.Collection;
import java.util.List;

/**
 * base repository定义
 *
 * @author xuyl
 * @version V1.0.0 2025/4/9
 * @since V100R001
 */
@SuppressWarnings(ICommonWarningType.UNUSED)
@NoRepositoryBean
public interface IBaseRepository<T extends BaseEntity, ID> extends JpaRepository<T, ID> {


    /**
     * 批量保存，可根据实体状态自动判断update还是insert
     *
     * @param entities 保存的实体集合
     */
    void batchSave(Collection<T> entities);

    /**
     * 批量insert，只可以进行insert操作
     *
     * @param entities 实体集合
     */
    void batchInsert(Collection<T> entities);

    /**
     * 批量update，只可以进行update操作
     *
     * @param entities 实体集合
     */
    void batchUpdate(Collection<T> entities);

    /**
     * 获取实体类型
     *
     * @return 实体类型
     */
    Class<T> getEntityClass();

    /**
     * 获取查询别名
     *
     * @return 查询别名
     */
    String getQueryAlias();

    /**
     * 逻辑删除
     *
     * @param ids ids
     */
    void logicDelete(Iterable<ID> ids);

    /**
     * 逻辑删除
     *
     * @param id id
     */
    void logicDelete(ID id);

    /**
     * 物理删除
     *
     * @param ids ids
     */
    void physicalDelete(Iterable<ID> ids);

    /**
     * 物理删除
     *
     * @param id id
     */
    void physicalDelete(ID id);

    /**
     * 根据id查询，包含逻辑删除的记录
     *
     * @param id id
     * @return 实体
     */
    T findByIdIncludeDeleted(ID id);

    /**
     * 根据id查询，包含逻辑删除的记录
     *
     * @param ids ids
     * @return 实体
     */
    List<T> findByIdsIncludeDeleted(Iterable<ID> ids);

}
